{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"align-center\">\n",
    "<a href=\"https://oumi.ai/\"><img src=\"https://oumi.ai/docs/en/latest/_static/logo/header_logo.png\" height=\"200\"></a>\n",
    "\n",
    "[![Documentation](https://img.shields.io/badge/Documentation-latest-blue.svg)](https://oumi.ai/docs/en/latest/index.html)\n",
    "[![Discord](https://img.shields.io/discord/1286348126797430814?label=Discord)](https://discord.gg/oumi)\n",
    "[![GitHub Repo stars](https://img.shields.io/github/stars/oumi-ai/oumi)](https://github.com/oumi-ai/oumi)\n",
    "<a target=\"_blank\" href=\"https://colab.research.google.com/github/oumi-ai/oumi/blob/main/notebooks/Oumi - Evaluation with Oumi.ipynb\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>\n",
    "</div>\n",
    "\n",
    "👋 Welcome to Open Universal Machine Intelligence (Oumi)!\n",
    "\n",
    "🚀 Oumi is a fully open-source platform that streamlines the entire lifecycle of foundation models - from [data preparation](https://oumi.ai/docs/en/latest/resources/datasets/datasets.html) and [training](https://oumi.ai/docs/en/latest/user_guides/train/train.html) to [evaluation](https://oumi.ai/docs/en/latest/user_guides/evaluate/evaluate.html) and [deployment](https://oumi.ai/docs/en/latest/user_guides/launch/launch.html). Whether you're developing on a laptop, launching large scale experiments on a cluster, or deploying models in production, Oumi provides the tools and workflows you need.\n",
    "\n",
    "🤝 Make sure to join our [Discord community](https://discord.gg/oumi) to get help, share your experiences, and contribute to the project! If you are interested in joining one of the community's open-science efforts, check out our [open collaboration](https://oumi.ai/community) page.\n",
    "\n",
    "⭐ If you like Oumi and you would like to support it, please give it a star on [GitHub](https://github.com/oumi-ai/oumi)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Evaluation with Oumi\n",
    "\n",
    "This notebook provides a guide for running end-to-end evaluations on your trained model using Oumi. Specifically, it explores how the performance of LLaMA models evolves as we scale from 1B to 3B and 8B parameters."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Prerequisites and Environment\n",
    "\n",
    "❗**NOTICE:** We recommend running this notebook on a GPU. If running on Google Colab, you can use the free T4 GPU runtime (Colab Menu: `Runtime` -> `Change runtime type`). Llama 8B is too large to fit on the T4 GPU for inference. You can remove it from the list of models to evaluate, or evaluate the SmolLM family of models instead of Llama in the `Experimental Setup` section.\n",
    "\n",
    "### Oumi Installation\n",
    "\n",
    "First, let's install Oumi, AlpacaEval, and vLLM. You can find more detailed instructions about Oumi installation [here](https://oumi.ai/docs/en/latest/get_started/installation.html)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "%pip install oumi alpaca_eval vllm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Llama Access\n",
    "\n",
    "Llama models are gated on HuggingFace Hub. To run this notebook, you must first complete the agreements for Llama [3.1](https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct) and [3.2](https://huggingface.co/meta-llama/Llama-3.2-1B-Instruct) on HuggingFace, and wait for them to be accepted. Then, specify `HF_TOKEN` below to enable access to the model if it's not already set.\n",
    "\n",
    "Usually, you can get the token by running this command `cat ~/.cache/huggingface/token` on your local machine."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "if not os.environ.get(\"HF_TOKEN\"):\n",
    "    # NOTE: Set your Hugging Face token here if not already set.\n",
    "    os.environ[\"HF_TOKEN\"] = \"<MY_HF_TOKEN>\"\n",
    "\n",
    "hf_token = os.environ.get(\"HF_TOKEN\")\n",
    "print(f\"Using HF Token: '{hf_token}'\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### OpenAI Access\n",
    "\n",
    "AlpacaEval 2.0 calculates win rates by comparing a model's responses to reference responses. This process requires an annotator, with the default being [GPT-4 Turbo](https://github.com/tatsu-lab/alpaca_eval?tab=readme-ov-file#alpacaeval-20). To access the latest GPT-4 models, an OpenAI API key is necessary. You can find instructions for creating an OpenAI account and generating an API key on [OpenAI's quickstart webpage](https://platform.openai.com/docs/)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "os.environ[\"OPENAI_API_KEY\"] = \"<MY_OPENAI_TOKEN>\"  # Specify your OpenAI API key here"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<b>⚠️ Cost considerations</b>: The cost of running a standard AlpacaEval 2.0 evaluation and annotating 805 examples with GPT-4 Turbo is <b>$3.50</b>. You need to evaluate on the full dataset to reproduce the results presented in this notebook. However, if you are only interested in experimenting with the API, you can limit the evaluation to a smaller number of examples. For instance, annotating just 3 examples will cost less than <b>0.5¢</b>."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# # The results shown below were generated from evaluating on the full dataset.\n",
    "# # Uncomment this if you want to reproduce the results.\n",
    "# NUM_ALPACA_EXAMPLES = None\n",
    "# NUM_MMLU_EXAMPLES = None\n",
    "\n",
    "NUM_ALPACA_EXAMPLES = 3  # Replace with None for full dataset evaluation.\n",
    "NUM_MMLU_EXAMPLES = 10  # Replace with None for full dataset evaluation."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Tutorial Directory Setup\n",
    "\n",
    "Finally, we will create a directory for the tutorial to store the results."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pathlib import Path\n",
    "\n",
    "tutorial_dir = \"./output/evaluation_tutorial/TEST_OUMI\"\n",
    "\n",
    "Path(tutorial_dir).mkdir(parents=True, exist_ok=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Experimental Setup\n",
    "\n",
    "In this experiment, we aim to compare the performance of models as we scale their size. For this purpose, we have selected LLaMA models with `1B`, `3B`, and `8B` parameters. In the code snippet below, you can specify any model hosted on HuggingFace, provide a path to a local directory containing your model, or use any other model format supported by Oumi inference. Additionally, note that we restrict the maximum number of tokens for each model to `8192` in order to optimize both cost and resource usage.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "MODEL_NAMES = [\n",
    "    \"meta-llama/Llama-3.2-1B-Instruct\",\n",
    "    \"meta-llama/Llama-3.2-3B-Instruct\",\n",
    "    \"meta-llama/Llama-3.1-8B-Instruct\",\n",
    "]\n",
    "MODEL_MAX_TOKENS = 8192\n",
    "\n",
    "# Alternative models to evaluate on Colab.\n",
    "# MODEL_NAMES = [\n",
    "#     \"HuggingFaceTB/SmolLM-135M-Instruct\",\n",
    "#     \"HuggingFaceTB/SmolLM-360M-Instruct\",\n",
    "#     \"HuggingFaceTB/SmolLM-1.7B-Instruct\",\n",
    "# ]\n",
    "# MODEL_MAX_TOKENS = 2048"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To conduct a comprehensive evaluation of a model's performance, it is essential to assess it across a [diverse set of benchmarks](https://oumi.ai/docs/en/latest/user_guides/evaluate/standardized_benchmarks.html#trade-offs). At a minimum, a [standardized benchmark](https://oumi.ai/docs/en/latest/user_guides/evaluate/standardized_benchmarks.html) is required to evaluate the model's knowledge and reasoning capabilities, while a [generative benchmark](https://oumi.ai/docs/en/latest/user_guides/evaluate/generative_benchmarks.html) is necessary to assess the quality of responses and its ability to follow instructions. In this evaluation, we select [MMLU Pro](https://arxiv.org/abs/2406.01574) for its focus on challenging, reasoning-intensive knowledge tasks and [AlpacaEval 2.0](https://arxiv.org/abs/2404.04475) for assessing the overall quality of the generated responses. To customize the evaluation tasks, please see [our documentation](https://oumi.ai/docs/en/latest/user_guides/evaluate/evaluation_config.html#configuration-options). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "from oumi.core.configs import EvaluationTaskParams\n",
    "\n",
    "TASKS = [\n",
    "    EvaluationTaskParams(\n",
    "        evaluation_backend=\"lm_harness\",\n",
    "        task_name=\"leaderboard_mmlu_pro\",\n",
    "        num_samples=NUM_MMLU_EXAMPLES,\n",
    "    ),\n",
    "    EvaluationTaskParams(\n",
    "        evaluation_backend=\"alpaca_eval\",\n",
    "        num_samples=NUM_ALPACA_EXAMPLES,\n",
    "    ),\n",
    "]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Evaluation\n",
    "\n",
    "To perform evaluations with Oumi, we define an [EvaluationConfig](https://oumi.ai/docs/en/latest/user_guides/evaluate/evaluation_config.html) for each model with the tasks discussed above, along with the relevant [model](https://github.com/oumi-ai/oumi/blob/main/src/oumi/core/configs/params/model_params.py) and [generation](https://github.com/oumi-ai/oumi/blob/main/src/oumi/core/configs/params/generation_params.py) parameters. If the system is equipped with a GPU, we strongly recommend configuring the [inference engine](https://oumi.ai/docs/en/latest/api/oumi.core.configs.html#oumi.core.configs.InferenceEngineType) to `VLLM` for optimal performance.\n",
    "\n",
    "The code snippet below illustrates how to run evaluations for our three models, storing the key metrics for each model in lists. Specifically, the length-controlled win rate for Alpaca is saved in `alpaca_lcwr`, while the accuracy for MMLU Pro is stored in `mmlu_acc`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "from oumi.core.configs import (\n",
    "    EvaluationConfig,\n",
    "    GenerationParams,\n",
    "    InferenceEngineType,\n",
    "    ModelParams,\n",
    ")\n",
    "from oumi.evaluate import evaluate\n",
    "\n",
    "# Store the results for 1B, 3B, 8B models in the following lists.\n",
    "mmlu_acc = []\n",
    "alpaca_lcwr = []\n",
    "\n",
    "for model_name in MODEL_NAMES:\n",
    "    print(f\"######################### Evaluating {model_name}...\")\n",
    "    # Define the evaluation configuration.\n",
    "    evaluation_config = EvaluationConfig(\n",
    "        tasks=TASKS,\n",
    "        model=ModelParams(\n",
    "            model_name=model_name,\n",
    "            model_max_length=MODEL_MAX_TOKENS,\n",
    "            torch_dtype_str=\"bfloat16\",\n",
    "        ),\n",
    "        generation=GenerationParams(max_new_tokens=MODEL_MAX_TOKENS),\n",
    "        inference_engine=InferenceEngineType.VLLM,\n",
    "        output_dir=tutorial_dir,\n",
    "    )\n",
    "\n",
    "    # Evaluate the model.\n",
    "    task_results = evaluate(evaluation_config)\n",
    "\n",
    "    # Store the results.\n",
    "    mmlu_acc.append(task_results[0][\"results\"][\"leaderboard_mmlu_pro\"][\"acc,none\"])\n",
    "    alpaca_lcwr.append(\n",
    "        task_results[1][\"results\"][\"alpaca_eval\"][\"length_controlled_winrate\"] / 100\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Evaluation Results\n",
    "\n",
    "The evaluation results are shown below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.20121343085106383, 0.281499335106383, 0.37142619680851063]\n",
      "[0.07650649505729805, 0.19105357406046689, 0.25572462470989504]\n"
     ]
    }
   ],
   "source": [
    "print(mmlu_acc)\n",
    "print(alpaca_lcwr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When visualizing the results using `matplotlib`'s `pyplot`, we observe a clear trend: both the model's knowledge and reasoning abilities (measured by MMLU Pro) and the quality of its responses (measured by AlpacaEval 2.0) improve as the model size increases. A notable performance gain is observed when scaling from 1B to 3B parameters. However, beyond this, the rate of improvement begins to plateau, indicating diminishing returns with further increases in model size."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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6tTh888/58UXXwSsPV0PPfQQZcqUsbX39/cnNTWV6OhoAgMDcx23iBR/cUkXWfVvDCsio1mz5xQXLmbYXvMu48pd9X3p2sCPNtUr4OJUeAaelADlAXdnR3a+FmrK++ZWxYoV6d69O/PmzcMwDLp37463t3eetc8Pbdu2xcHBgcTERKpXr86iRYvw9fW1VWu1aNHC1jY+Pp7jx4/Trl07u2u0a9eO7du3X/M9kpOTcXNzy3J8zpw59OrVCycn669Knz59eOGFF9i/fz81atRg27ZtVKlSxZb8XG3btm089NBDub3lLK68x0zTp09nzpw5REVFkZycTGpqKk2aNAHg5MmTHD9+nE6dOl3zmo8//jiffPIJL774IjExMfz888/89ttvdm0ye9ySkpJu+R5EpPg4GX+BFTtj+CUymvX7z5CWcXlKRkB5d0Lr+xHawI9mVcvh6FA4FztVApQHLBaL6V15uTFo0CDbXJBr9YjcSvureXp6ZltJFBsbi5eX1w3PX7RoEfXr16dChQrZVo2VLl061zFdzdvb2zYvJ9PZs2dZtmwZFy9eZMaMGbbj6enpzJkzhwkTJtgShGu50esODg5Z5nJlN8n56ntcuHAhI0eOZPLkybRp0wYPDw/eeecdNmzYkKP3BejXrx+jRo1i/fr1/Pnnn1SrVo327dvbtTl79ixgTYRFpGQ7fCaRFZHRhEVE8/eRWK78r6uOrwehDfwIDfalfiXPIrHCe9H51JY807VrV1JTU7FYLLahnbxsf7U6derwyy+/ZDm+devWa/acXCkgIIAaNWrk6L08PT3x9/dn3bp1dOjQwXZ83bp1tGrV6prnNW3aNEu105dffkmVKlVYvny53fFffvmFyZMn89prr9GoUSOOHj3Knj17sr2XRo0asWrVKrvhqitVrFiREydO2J7Hx8dz8ODBG97nunXraNu2Lc8884zt2P79+21fe3h4EBQUxKpVq7jjjjuyvUaFChXo2bMnc+fOZf369VmG2AAiIiKoUqVKgff6iYj5rOXq51kRGc2KyGj+jT5v93rTqmUJDfYjNNiPat63/odoQVMCVAI5Ojqya9cu29d51T4uLo5t27bZHatQoQJPP/0006ZNY9iwYTz++OO4urry448/8tVXX/H999/f/I1cwwsvvMDYsWOpUaMGTZo0Ye7cuWzbto0vv/zymueEhoYyevRozp07R7ly5QCYPXs2Dz74IA0aNLBrGxAQwOjRowkLC6N79+7cfvvtPPDAA7z33nvUrFmTf//9F4vFQteuXRk9ejQNGzbkmWee4amnnsLFxYXVq1fz0EMP4e3tzZ133sm8efPo0aMHZcuWZcyYMTn6mdSqVYvPPvuMFStWUK1aNT7//HM2bdpEtWrVbG3GjRvHU089hY+Pj22i9rp16xg6dKitzeOPP84999xDeno6/fv3z/I+f/zxB126dLlhPCJSPGRkGPx95BxhEdGsiIwh6uzl4W9HBwttqlcgNNiXu+r74eeVddpAUaIEqITy9PTM8/bh4eFZyuMfe+wxPv30U37//Xf+97//0blzZ1JTU6lbty5ff/01Xbt2zVUcOTFs2DDi4uJ4/vnnOXnyJPXr1+e77767ZgUYQMOGDWnWrBmLFy/mv//9L1u2bGH79u3MmjUrS1svLy86derE7Nmz6d69O0uWLGHkyJH06dOHxMREatasyaRJkwCoXbs2v/zyCy+//DKtWrXC3d2dkJAQ+vTpA8Do0aM5ePAg99xzD15eXrz++us56gH673//y99//02vXr2wWCz06dOHZ555hp9//tnWpn///ly4cIH333+fkSNH4u3tzYMPPmh3nc6dO1OpUiWCg4OzTAK/cOECy5cvv+ESAiJStKWmZfDXgTOERUbz684YTp2/vEChq5MDt9euSNdgPzrV86FsKRcTI81bFiO3i8mUAPHx8Xh5eREXF5flg//ChQscPHiQatWqZTtpVoquH3/8kRdeeIGIiAgcHApPpUJ+SkhIoHLlysydO9eukg6sZfTLli3LdvgyL+l3SqTgJaWm8fueU6yIjGHlrhjOX1Wu3qmeD6GFpFw9N673+X21onNXIvmse/fu7N27l2PHjhEQEGB2OPkqIyOD06dPM3nyZMqWLcu9996bpY2zszMffvihCdGJSH7ILFcPi4jm971Zy9W7BPsSGlz4ytXzixIgkStkt2dZcRQVFUW1atWoUqUK8+bNs5X5X+nxxx83ITIRyUuZ5eorIqL560D25epdG/jRtBCXq+cXJUAiJVBQUFCut1IRkaLh0OlEW+XW1qhYu9fq+nnQJdiPrsF+1KvkUSTK1fOLEiAREZEiLLNcPSwyml+uUa7e9VK5elARLFfPL0qAREREipiMDIOtUeesCxNGRnPk7OVNmotbuXp+UQIkIiJSBNyoXL1D7YqEFsNy9fyiBEhERKSQyixXD4uIZtW/J+3L1d2c6FTXh64N/Li9dtEqVy8M9N0SEREpRGKTUlm16yQrIq9drt412I/WJaRcPb8oARKb8PBw7rjjDs6dO5ftpqPFncViYdmyZfTs2dPsUAC4/fbbeeqpp/jPf/5jdig3rXfv3rRs2ZLnn3/e7FBECrWY+Av8cqlcff2BM6RfVa6eOYm5JJar5xeljiXM+vXrcXR0pHv37maHkmPjxo3DYrFkedStW7dA45g4cSItW7bEw8MDHx8fevbsye7du2943tdff03dunVxc3OjYcOG/PTTTzc857vvviMmJobevXvbjgUFBTFlypTrnrdkyRI6duyIl5cXZcqUoVGjRrz22mu2Xd2v1rp1a5566im7YzNnzsRisTBv3jy74wMGDLDtFh8eHm73s6hYsSJ33303O3bssDvnlVdeYcKECcTFxd3wnkVKmkOnE/l4zX7+76N1hLy5ileXR7B232nSMwzq+nkwrFMtfhrWnt9fuIP/da9Pi6DySn7ykBKgEmb27NkMHTqU33//nePHj5sdTo4FBwdz4sQJu8fatWsLNIY1a9YwePBg/vrrL3799VcuXrxIly5dSExMvOY5f/75J3369OGxxx7j77//pmfPnvTs2ZOIiIjrvtcHH3zAwIEDc7Ulx//+9z969epFy5Yt+fnnn4mIiGDy5Mls376dzz//PNtz7rjjDsLDw+2OrV69moCAgCzHw8PDufPOO+2O7d69mxMnTrBixQpSUlLo3r07qampttcbNGhAjRo1+OKLL3J8HyLFlWEYRB6P471f99B1yu90fDeciT//y9+X1uppVrUso7vVJXxkR8KG386Iu2pT39+zRK/Vk68MySIuLs4AjLi4uCyvJScnGzt37jSSk5NNiOzWnD9/3ihTpozx77//Gr169TImTJhg9/rq1asNwDh37pxhGIYxd+5cw8vLy1i2bJlRs2ZNw9XV1ejSpYsRFRVlO2ffvn3Gvffea/j4+BilS5c2WrRoYfz66692171w4YLx4osvGlWqVDFcXFyMGjVqGJ9++qlhGIaRlpZmDBo0yAgKCjLc3NyM2rVrG1OmTLE7f+zYsUbjxo2veV+jR482WrVqleV4o0aNjPHjxxuGYRgbN240OnfubFSoUMHw9PQ0br/9dmPLli127QFj2bJl1/0eXunkyZMGYKxZs+aabR5++GGje/fudsdCQkKM//73v9e9rsViMSIiIuyOBwYGGu+//36252zYsMEAsnzvMmX+TK+2YsUKAzBOnDhhO+br62tMnz7dCAwMtB07cOCAARirV682DCPrvxXDMIzvvvvOAIzt27fbvcf48eON2267LfubNYr275TIjaSnZxibDp4xXv8+0rjtrVVG4Es/2B41Rv9o9J31l/HZ+kNGdJz+/eeF631+X61Q9ABNnz6doKAg3NzcCAkJYePGjddsu3TpUlq0aEHZsmUpXbo0TZo0yfLX7YABA7IMl+THruM2hgGpiQX/yOVKvosXL6Zu3brUqVOHRx55hDlz5txwNeCkpCQmTJjAZ599xrp164iNjbUblklISODuu+9m1apV/P3333Tt2pUePXoQFRVla9OvXz+++uorPvjgA3bt2sXHH39MmTJlAOueVFWqVOHrr79m586djBkzhpdffpnFixfn+L769u3Lxo0b2b9/v+1YZGQk//zzj23+zPnz5+nfvz9r167lr7/+olatWtx9992cP3/+Wpe9ocxhnfLly1+zzfr16+ncubPdsdDQUNavX3/Nc9auXUupUqWoV69ejmP58ssvKVOmDM8880y2r19rTle7du1wdnZm9erVAOzcuZPk5GQee+wxzpw5Y9uZfvXq1bi5udGmTZtsrxMXF8fChQsBcHGxL79t1aoVGzduJCUlJbtTRYqd1LQM1uw5xcvLdtDqzVU8OHM9n649yJGzybg5O9Clvi+TH2rM5lc688XjITzaOhBfT63VU9BMnwS9aNEiRowYwcyZMwkJCWHKlCmEhoaye/dufHx8srQvX748//vf/6hbty4uLi788MMPDBw4EB8fH0JDQ23tunbtyty5c23PXV1d8+8mLibBm/75d/1refk4uOR8Vc/Zs2fzyCOPANbvT1xcHGvWrKFjx47XPOfixYtMmzaNkJAQAObPn0+9evXYuHEjrVq1onHjxjRu3NjW/vXXX2fZsmV89913DBkyhD179rB48WJ+/fVXWyJQvXp1W3tnZ2fGjx9ve16tWjXWr1/P4sWLefjhh23Hd+zYYUuaMj3yyCPMnDmT4OBgGjduzIIFC3j11VcBa0IQEhJCzZo1AbIM3XzyySeULVuWNWvWcM899+T4e5gpIyOD4cOH065dOxo0aHDNdtHR0fj6+tod8/X1JTo6+prnHD58GF9f31wNf+3du5fq1avj7Oyc43MASpcuTatWrQgPD6dPnz6Eh4dz22234erqStu2bQkPD6datWqEh4fTpk2bLL9HVapUAbANA957771Z5mb5+/uTmppKdHQ0gYGBuYpPpKhISk1jze5TrIjMvly9cz1fQoN9Va5eiJj+U3jvvfd44oknGDhwIGCdgPnjjz8yZ84cRo0alaX91R/Wzz77LPPnz2ft2rV2CZCrqyt+fn45iiElJcXur9P4+PibuJPCbffu3WzcuJFly5YB4OTkRK9evZg9e/Z1EyAnJydatmxpe163bl3Kli3Lrl27aNWqFQkJCYwbN44ff/yREydOkJaWRnJysq0HaNu2bTg6OtKhQ4drvsf06dOZM2cOUVFRJCcnk5qaSpMmTeza1KlTh++++87umKenp+3rvn37MmfOHF599VUMw+Crr75ixIgRttdjYmJ45ZVXCA8P5+TJk6Snp5OUlGTXU5UbgwcPJiIiIl/mISUnJ+Pmlru/Bm/Uk3c9HTt25Ouvvwas83wy/z106NCB8PBwBg4cSHh4OE888USWc//44w9KlSrFX3/9xZtvvsnMmTOztHF3dwesvYkixUlmuXpYZDS/7zlFStrlcvWKHq50qW/dXV3l6oWTqQlQamoqW7ZsYfTo0bZjDg4OdO7c+bpDBJkMw+C3335j9+7dvPXWW3avhYeH4+PjQ7ly5bjzzjt54403qFChQrbXmThxol0vRK45l7L2xhQ051I5bjp79mzS0tLw97/cU2UYBq6urkybNg0vL6+bCmHkyJH8+uuvvPvuu9SsWRN3d3cefPBB20TYzA+/a1m4cCEjR45k8uTJtGnTBg8PD9555x02bNhg187FxcXWm5OdPn368NJLL7F161aSk5M5cuQIvXr1sr3ev39/zpw5w9SpUwkMDMTV1ZU2bdrYTdjNqSFDhvDDDz/w+++/23pArsXPz4+YmBi7YzExMddNzr29vTl37lyuYqpduzZr167l4sWLue4FuuOOO5gwYQLHjh0jPDyckSNHAtYE6OOPP2b//v0cOXIkSy8aWHvsypYtS506dTh58iS9evXi999/t2uTWYFWsWLFXMUlUhjFxF/gl8hoVkTGZClXr1q+FKHBvtbd1QPK4aCKrULN1ATo9OnTpKenZztE8O+//17zvLi4OCpXrkxKSgqOjo589NFH3HXXXbbXu3btyv3330+1atXYv38/L7/8Mt26dbOVgF9t9OjRdr0F8fHxBAQE5PxGLJZcDUUVtLS0ND777DMmT55Mly5d7F7r2bMnX331VZZS6CvP3bx5M61atQKsPUmxsbG2+Snr1q1jwIAB/N///R9gnRN06NAh2/kNGzYkIyODNWvWZJkLk3l+27Zt7eauXDmXJ6eqVKlChw4d+PLLL0lOTuauu+6yG0Jdt24dH330EXfffTcAR44c4fTp07l6D8MwGDp0KMuWLbMNDd1ImzZtWLVqFcOHD7cd+/XXX685lwagadOmREdHc+7cOcqVK5ej2P7zn//wwQcf8NFHH/Hss89meT02Nvaa84Datm2Li4sLH330ERcuXKB58+YAtGzZklOnTjFnzhzbUNn1DB48mIkTJ7Js2TLbvweAiIgIqlSpgre3d47uRaSwOXjF7up/Z7O7euilNXpK+u7qRY3pQ2A3w8PDg23btpGQkMCqVasYMWIE1atXt3XdXzlJt2HDhjRq1IgaNWoQHh5Op06dslzP1dU1f+cImeyHH37g3LlzPPbYY1l6eh544AFmz559zQTI2dmZoUOH8sEHH+Dk5MSQIUNo3bq17cOwVq1aLF26lB49emCxWHj11VfJyLjcDRwUFET//v0ZNGgQH3zwAY0bN+bw4cOcPHmShx9+mFq1avHZZ5+xYsUKqlWrxueff86mTZuyJBdpaWlZ5s1YLBa75Llv376MHTuW1NRU3n//fbu2tWrV4vPPP6dFixbEx8fzwgsv3LB36mqDBw9mwYIFfPvtt3h4eNji8fLysl2rX79+VK5cmYkTJwLWIdoOHTowefJkunfvzsKFC9m8eTOffPLJNd+nadOmeHt7s27duizzk44dO8a2bdvsjgUGBhISEsKLL77I888/z7Fjx/i///s//P392bdvHzNnzuS2227LNjECay9d69at+fDDD2nXrp3tjwQXFxe74zfqWSpVqhRPPPEEY8eOpWfPnrYPgj/++CNL4i1SmBmGwc4T8ayItC5MuDvGvliiWdWytqRHu6sXYflZjnYjKSkphqOjY5bS4379+hn33ntvjq/z2GOPGV26dLluG29vb2PmzJk5ul5xK4O/5557jLvvvjvb1zLLp7dv337NMvglS5YY1atXN1xd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s8MqUMeOHeORRx6hQoUKuLu707BhQzZv3mx2WAUmKCgoy78Bi8XC4MGDzQ6tQKSnp/Pqq69SrVo13N3dqVGjBq+//nqO9u3KD1oJuoAkJibSuHFjBg0axP333292OAVuzZo1DB48mJYtW5KWlsbLL79Mly5d2LlzJ6VLlzY7vHxXpUoVJk2aRK1atTAMg/nz53Pffffx999/ExwcbHZ4BWrTpk18/PHHNGrUyOxQClxwcDArV660PXdyKjn/BZ87d4527dpxxx138PPPP1OxYkX27t1LuXLlzA6twGzatIn09HTb84iICO666y4eeughE6MqOG+99RYzZsxg/vz5BAcHs3nzZgYOHIiXlxfDhg0r8HhKzm+fybp160a3bt3MDsM0YWFhds/nzZuHj48PW7Zs4fbbbzcpqoLTo0cPu+cTJkxgxowZ/PXXXyUqAUpISKBv377MmjWLN954w+xwCpyTkxN+fn5mh2GKt956i4CAAObOnWs7Vq1aNRMjKngVK1a0ez5p0iRq1KhBhw4dTIqoYP3555/cd999dO/eHbD2iH311Vds3LjRlHg0BCamiIuLA6B8+fImR1Lw0tPTWbhwIYmJibRp08bscArU4MGD6d69O507dzY7FFPs3bsXf39/qlevTt++fYmKijI7pALz3Xff0aJFCx566CF8fHxo2rQps2bNMjss06SmpvLFF18waNCgPN90u7Bq27Ytq1atYs+ePQBs376dtWvXmtY5oB4gKXAZGRkMHz6cdu3a0aBBA7PDKTA7duygTZs2XLhwgTJlyrBs2TLq169vdlgFZuHChWzdupVNmzaZHYopQkJCmDdvHnXq1OHEiROMHz+e9u3bExERgYeHh9nh5bsDBw4wY8YMRowYwcsvv8ymTZsYNmwYLi4u9O/f3+zwCtzy5cuJjY1lwIABZodSYEaNGkV8fDx169bF0dGR9PR0JkyYQN++fU2JRwmQFLjBgwcTERHB2rVrzQ6lQNWpU4dt27YRFxfHN998Q//+/VmzZk2JSIKOHDnCs88+y6+//oqbm5vZ4Zjiyr9yGzVqREhICIGBgSxevJjHHnvMxMgKRkZGBi1atODNN98EoGnTpkRERDBz5swSmQDNnj2bbt264e/vb3YoBWbx4sV8+eWXLFiwgODgYLZt28bw4cPx9/c35d+AEiApUEOGDOGHH37g999/p0qVKmaHU6BcXFyoWbMmAM2bN2fTpk1MnTqVjz/+2OTI8t+WLVs4efIkzZo1sx1LT0/n999/Z9q0aaSkpODo6GhihAWvbNmy1K5dm3379pkdSoGoVKlSlmS/Xr16LFmyxKSIzHP48GFWrlzJ0qVLzQ6lQL3wwguMGjWK3r17A9CwYUMOHz7MxIkTlQBJ8WUYBkOHDmXZsmWEh4eXuMmP2cnIyCAlJcXsMApEp06d2LFjh92xgQMHUrduXV566aUSl/yAdUL4/v37efTRR80OpUC0a9cuy9IXe/bsITAw0KSIzDN37lx8fHxsk4FLiqSkJBwc7KceOzo6kpGRYUo8SoAKSEJCgt1fegcPHmTbtm2UL1+eqlWrmhhZwRg8eDALFizg22+/xcPDg+joaAC8vLxwd3c3Obr8N3r0aLp160bVqlU5f/48CxYsIDw8nBUrVpgdWoHw8PDIMt+rdOnSVKhQocTMAxs5ciQ9evQgMDCQ48ePM3bsWBwdHenTp4/ZoRWI5557jrZt2/Lmm2/y8MMPs3HjRj755BM++eQTs0MrUBkZGcydO5f+/fuXqGUQwFoNO2HCBKpWrUpwcDB///037733HoMGDTInIEMKxOrVqw0gy6N///5mh1Ygsrt3wJg7d67ZoRWIQYMGGYGBgYaLi4tRsWJFo1OnTsYvv/xidlim6tChg/Hss8+aHUaB6dWrl1GpUiXDxcXFqFy5stGrVy9j3759ZodVoL7//nujQYMGhqurq1G3bl3jk08+MTukArdixQoDMHbv3m12KAUuPj7eePbZZ42qVasabm5uRvXq1Y3//e9/RkpKiinxWAzDpCUYRUREREyidYBERESkxFECJCIiIiWOEiAREREpcZQAiYiISImjBEhERERKHCVAIiIiUuIoARIREZESRwmQiIiIlDhKgESKkPDwcCwWC7GxsTk+JygoiClTptzS++bFNW7kzJkz+Pj4cOjQoVydN2DAAHr27Gl73rFjR4YPH257fnXsFouF5cuX31Kskr9at25dIjdJlYKlBEgkjwwYMACLxcJTTz2V5bXBgwdjsVgYMGBAwQd2A0lJSYwePZoaNWrg5uZGxYoV6dChA99++62tzaZNm3jyySfzNY4JEyZw3333ERQUBMChQ4ewWCy2h4uLCzVr1uSNN97gygXsp06dyrx583L8PidOnKBbt255HL29efPm2eJ2cHCgSpUqDBw4kJMnT+br++anqxPL/PTKK68watQo0zbJlJJBCZBIHgoICGDhwoUkJyfbjl24cIEFCxYU2k1vn3rqKZYuXcqHH37Iv//+S1hYGA8++CBnzpyxtalYsSKlSpXKtxiSkpKYPXs2jz32WJbXVq5cyYkTJ9i7dy/jx49nwoQJzJkzx/a6l5cXZcuWzfF7+fn54erqmhdhX5enpycnTpzg6NGjzJo1i59//vmWdn6/ePFiHkZnntTU1Bu26datG+fPn+fnn38ugIikpFICJJKHmjVrRkBAAEuXLrUdW7p0KVWrVqVp06Z2bVNSUhg2bBg+Pj64ublx2223sWnTJrs2P/30E7Vr18bd3Z077rgj2+GhtWvX0r59e9zd3QkICGDYsGEkJibmOObvvvuOl19+mbvvvpugoCCaN2/O0KFD7XZovnIY6crejSsf48aNs7X/9NNPqVevHm5ubtStW5ePPvroujH89NNPuLq60rp16yyvVahQAT8/PwIDA+nbty/t2rVj69atttevHgK7kauHwHbs2MGdd96Ju7s7FSpU4MknnyQhISHL9d99910qVapEhQoVGDx48A0TEovFgp+fH/7+/nTr1o1hw4axcuVKkpOTCQsL47bbbqNs2bJUqFCBe+65h/3799vOzez9WrRoER06dMDNzY0vv/ySM2fO0KdPHypXrkypUqVo2LAhX331ld37duzYkaFDhzJ8+HDKlSuHr68vs2bNIjExkYEDB+Lh4UHNmjWzJBcRERF069aNMmXK4Ovry6OPPsrp06dt34M1a9YwdepU288789/i9c7LjGfIkCEMHz4cb29vQkNDMQyDcePGUbVqVVxdXfH392fYsGG2cxwdHbn77rtZuHBhzn6oIjdBCZBIHhs0aBBz5861PZ8zZw4DBw7M0u7FF19kyZIlzJ8/n61bt1KzZk1CQ0M5e/YsAEeOHOH++++nR48ebNu2jccff5xRo0bZXWP//v107dqVBx54gH/++YdFixaxdu1ahgwZkuN4/fz8+Omnnzh//nyO2vfq1YsTJ07YHl999RVOTk60a9cOgC+//JIxY8YwYcIEdu3axZtvvsmrr77K/Pnzr3nNP/74g+bNm9/wvTdv3syWLVsICQnJ2c3dQGJiIqGhoZQrV45Nmzbx9ddfs3Llyizfv9WrV7N//35W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jubo0aP8/PPPTJ069Zqx5Vbfvn1xc3Ojf//+REREsHr1aoYOHcqjjz5qGybKa+XKlaNChQp88skn7Nu3j99++40RI0bk6NxatWrx66+/8ueff7Jr1y7++9//EhMTc8sxDR48mLNnz9KnTx82bdrE/v37WbFiBQMHDrQlPUFBQWzYsIFDhw5x+vRpMjIycnRedubNm8fs2bOJiIjgwIEDfPHFF7i7u9v+GADrxPguXbrc8r2JXIsSIJF84unped0P6UmTJvHAAw/w6KOP0qxZM/bt28eKFSsoV64cYB3CWrJkCcuXL6dx48bMnDmTN9980+4ajRo1Ys2aNezZs4f27dvTtGlTxowZg7+/f47jDA0NZf78+XTp0oV69eoxdOhQQkNDWbx4cbbt16xZQ3p6Ovfeey+VKlWyPd59910AHn/8cT799FPmzp1Lw4YN6dChA/PmzaNatWrXjKFhw4Y0a9Ys2/fs3LkzlSpVIigoiCeffJK7776bRYsW5fj+rqdUqVKsWLGCs2fP0rJlSx588EE6derEtGnT8uT62XFwcGDhwoVs2bKFBg0a8Nxzz/HOO+/k6NxXXnmFZs2aERoaSseOHfHz88vVEgDX4u/vz7p160hPT6dLly40bNiQ4cOHU7ZsWRwcrB8TI0eOxNHRkfr161OxYkWioqJydF52ypYty6xZs2jXrh2NGjVi5cqVfP/991SoUAGAY8eO8eeff2ZbPSmSVyyGccWSqiIiJvnxxx954YUXiIiIuO6HpxR/L730EufOnbObXyaS1zQHSEQKhe7du7N3716OHTtGQECA2eGIiXx8fHI8LChys9QDJCIiIiWO+plFRESkxFECJCIiIiWOEiAREREpcZQAiYiISImjBEhERERKHCVAIiIiUuIoARIREZESRwmQiIiIlDhKgERERKTE+X83KjjmBlSJLAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "assert NUM_ALPACA_EXAMPLES is None and NUM_MMLU_EXAMPLES is None, (\n",
    "    \"Skipping plotting as evaluating on such a small subset of data will not give \"\n",
    "    \"meaningful results.\\nPlease set `NUM_ALPACA_EXAMPLES` and `NUM_MMLU_EXAMPLES` to \"\n",
    "    \"None for full dataset evaluation.\"\n",
    ")\n",
    "\n",
    "# Data\n",
    "model_sizes = [1, 3, 8]\n",
    "plt.plot(model_sizes, mmlu_acc, label=\"MMLU Pro (Accuracy)\")\n",
    "plt.plot(model_sizes, alpaca_lcwr, label=\"AlpacaEval 2.0 (LC WR)\")\n",
    "\n",
    "# Show\n",
    "plt.xlabel(\"Model Size (Billion Parameters)\")\n",
    "plt.ylabel(\"Model Performance\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 🧭 What's Next?\n",
    "\n",
    "Congrats on finishing this notebook! Feel free to check out our other [notebooks](https://github.com/oumi-ai/oumi/tree/main/notebooks) in the [Oumi GitHub](https://github.com/oumi-ai/oumi), and give us a star! You can also join the Oumi community over on [Discord](https://discord.gg/oumi).\n",
    "\n",
    "📰 Want to keep up with news from Oumi? Subscribe to our [Substack](https://blog.oumi.ai/) and [Youtube](https://www.youtube.com/@Oumi_AI)!\n",
    "\n",
    "⚡ Interested in building custom AI in hours, not months? Apply to get [early access](https://oumi-ai.typeform.com/early-access) to the Oumi Platform, or [chat with us](https://calendly.com/d/ctcx-nps-47m/chat-with-us-get-early-access-to-the-oumi-platform) to learn more!"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "oumi",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
